package network;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class UdpEchoClient {
    //客户端和服务器一样
    //刚开始也需要创建 DatagramSocket 对象
    //接下来要对网卡进行操作
    //就需要借助 socket 这个 “遥控器”
    private DatagramSocket socket = null;
    private String severIp;
    private int severPort;


    //需要只要服务器的ip和端口号
    //通过额外的途径进行获取
    //利用String severIp,int severPort 来获取
    //因此服务器的IP和端口号不能老变
    public UdpEchoClient(String severIp,int severPort) throws SocketException {
        this.socket = new DatagramSocket();
        this.severIp = severIp;
        this.severPort = severPort;
    }

    public void start() throws IOException {
        System.out.println("客户端启动！！！");
        Scanner scanner = new Scanner(System.in);
        while (true){
            //1.让用户从控制台进行输入，发送给服务器
            System.out.println("请输入要发送的请求：");
            String request = scanner.next();
            //2.构造请求并发送
            //先实例化一个 DatagramPacket 对象 （数据报）
            // 不光要有数据   还要有目标 就是你要发给哪个服务器的哪个端口 也需要在这写出来
            // severIp = 127.0.0.1
            // 但是  InetAddress.getByName(severIp) 需要把 severIp 转换成一个Java能识别的对象
            //  转换成 InetAddress 这个对象 （系统能识别的IP地址）
            DatagramPacket requestPacket = new DatagramPacket(
                    request.getBytes(),
                    0,
                    request.getBytes().length,
                    InetAddress.getByName(severIp),
                    severPort
            );
            socket.send(requestPacket);

            //3.读取响应数据
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);

            //4.显示响应到 控制台上
            String response = new String(responsePacket.getData(),0, responsePacket.getLength());
            System.out.println(response);
        }
    }



    public static void main(String[] args) throws IOException {
        // 使用后 127.0.0.1 是因为服务器和客户端在同一个主机上
        // 此时就固定写这个ip
        // 它又叫做 环回ip  系统提供的特殊ip
        UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);
        //客户端的端口号 是操作系统自动进行分配的

        client.start();


    }
}
